package cn.itcast.nems.product.service;


import cn.itcast.nems.common.bean.ProductState;
import cn.itcast.nems.product.dao.dataobject.ProductDO;
import cn.itcast.nems.product.dao.dataobject.ProductPriceDO;
import cn.itcast.nems.product.dao.entity.Product;
import cn.itcast.nems.product.dto.ClassTypeCampusDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.time.LocalDate;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 产品 服务类
 * </p>
 *
 * @author liyong
 * @since 2023-08-31
 */
public interface ProductService extends IService<Product> {

    /**
     * 根据产品编号查询产品
     *
     * @param bizNo 产品编号
     * @return 产品
     */
    ProductDO findProduct(String bizNo);

    /**
     * 跟进订单低获取订单行对应低产品信息
     * @param orderId 订单ID
     * @return 订单行对应低产品信息
     */
    List<ProductDO> findListByOrderId(String orderId) ;

    /**
     * 根据班级ID查询产品相关的产品
     *
     * @param clazzId 班级ID
     * @return 产品
     */
    List<ProductDO> findProducts(int clazzId);

    /**
     * 刷新所有过期产品为下架状态
     */
    int flushInvalidState();

    /**
     * 分页查询
     *
     * @param page      分页参数
     * @param productDO 搜索条件
     * @return 分页数据
     */
    IPage<ProductPriceDO> findPageList(Page<ProductPriceDO> page, ProductPriceDO productDO);

    /**
     * 查询产品信息
     *
     * @param startDate      有效期起始日期
     * @param endDate        有效期结束日期
     * @param state          状态
     * @param includeExpired 是否包含过期产品
     * @return 产品信息
     */
    List<ProductDO> findProducts(LocalDate startDate,
                                 LocalDate endDate,
                                 ProductState state,
                                 Boolean includeExpired);

    /**
     * 查询产品
     * @param classTypeId 班级类型ID
     * @param campusIds 校区ID
     * @return 产品信息
     */
    List<ProductDO> findProducts(String classTypeId,
                                 Set<String> campusIds);

    /**
     * 查询产品
     *
     * @param classTypeCampus 班级类型和校区
     * @return 产品信息
     */
    List<ProductDO> findProducts(List<ClassTypeCampusDTO> classTypeCampus);

    /**
     * 更新产品价格
     *
     * @param operator 操作者
     * @param products 价格变更的产品
     */
    int updateProductStates(List<ProductDO> products, String operator);
    
    /**
     * 
     * 功能描述：增加库存数量
     * @param productId 目标产品ID
     * @param quantity 本次增加数量
     *
     * @return 更新数量
     * 
     * @author 刘曙
     *
     * @since 2023年9月17日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    int increaseInventorySoldQuantity(Long productId, Integer quantity);
    
    /**
     * 
     * 功能描述：减少库存数量
     * @param productId 目标产品ID
     * @param quantity 本次减少数量
     *
     * @return 更新数量
     * 
     * @author 刘曙
     *
     * @since 2023年9月17日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    int decreaseInventorySoldQuantity(Long productId, Integer quantity);
    
    /**
     * 
     * 功能描述：增加库存数量（不影响售出数量）
     *
     * @param productId 产品ID
     * @param quantity 库存数量
     * @return 更新数量
     * 
     * @author 刘曙
     *
     * @since 2023年9月20日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    int increaseInventoryQuantity(Long productId, Integer quantity);
}
